/*
* Sun Mar 2 19:15:28 1997 Doug Lea (dl at gee)
* Based on RadiusHandle
*/
package CH.ifa.draw.contrib;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.Rectangle;
import CH.ifa.draw.framework.Drawing;
import CH.ifa.draw.standard.AbstractHandle;
import CH.ifa.draw.util.Geom;
/**
* A Handle to rotate a TriangleFigure
*/
class TriangleRotationHandle extends AbstractHandle {
private Point fOrigin = null;
private Point fCenter = null;
public TriangleRotationHandle(TriangleFigure owner) {
super(owner);
}
public void invokeStart(int x, int y, Drawing drawing) {
fCenter = owner().center();
fOrigin = getOrigin();
}
public void invokeStep (int dx, int dy, Drawing drawing) {
double angle = Math.atan2(fOrigin.y + dy - fCenter.y,
fOrigin.x + dx - fCenter.x);
((TriangleFigure)(owner())).rotate(angle);
}
public void invokeEnd (int dx, int dy, Drawing drawing) {
fOrigin = null;
fCenter = null;
}
public Point locate() {
return getOrigin();
}
Point getOrigin() { // find a nice place to put handle
// almost same code as PolygonScaleHandle
Polygon p = ((TriangleFigure)(owner())).polygon();
Point first = new Point(p.xpoints[0], p.ypoints[0]);
Point ctr = owner().center();
double len = Geom.length(first.x, first.y, ctr.x, ctr.y);
if (len == 0) // best we can do?
return new Point(first.x - HANDLESIZE/2, first.y + HANDLESIZE/2);
double u = HANDLESIZE / len;
if (u > 1.0) // best we can do?
return new Point((first.x * 3 + ctr.x)/4, (first.y * 3 + ctr.y)/4);
else
return new Point((int)(first.x * (1.0 - u) + ctr.x * u),
(int)(first.y * (1.0 - u) + ctr.y * u));
}
public void draw(Graphics g) {
Rectangle r = displayBox();
g.setColor(Color.yellow);
g.fillOval(r.x, r.y, r.width, r.height);
g.setColor(Color.black);
g.drawOval(r.x, r.y, r.width, r.height);
}
}